Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vb.net] Muovere un'immagine dentro una picture box
Forum - C# / VB.NET - [vb.net] Muovere un'immagine dentro una picture box

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
ashgan (Normal User)
Newbie


Messaggi: 3
Iscritto: 04/08/2011

Segnala al moderatore
Postato alle 1:14
Giovedì, 04/08/2011
Ciao a tutti, ho questo dilemma. Ho un'immagine molto grande (più della risoluzione del monitor) e vorrei fare in modo che utilizzando le frecce direzionali riesca a vedere le varie parti dell'immagine. Ho provato sia ad utilizzare la proprietà location che la proprietà top/left della picturebox e, sebbene l'immagine venga spostata correttamente in entrambi i casi, con mio dispiacere ho constatato che purtroppo è tagliata alla risoluzione impostata, quindi in pratica, spostando l'immagine in alto, in basso vedo il colore di background grigio invece del resto dell'immagine. Come faccio a creare una cosa del genere? Grazie.

PM Quote
Avatar
ashgan (Normal User)
Newbie


Messaggi: 3
Iscritto: 04/08/2011

Segnala al moderatore
Postato alle 2:51
Giovedì, 04/08/2011
Ho provato a inserire la picturebox in un panel e ad attivare l'autoscroll. L'effetto è esattamente quello che vorrei, purtroppo ho scoperto che non è possibile nascondere le barre dello scrolling (cosa veramente inspiegabile) e quindi sto da capo a dodici. In vb6 tra l'altro ho trovato un codice che fa proprio quello che voglio (l'ho anche provato e funziona) ma la mia maledetta niubbagine fa si che non riesca a portarlo in vb.net, nel quale molti metodi non esistono più. Il codice è questo:


    ''Option Explicit

    'Private mPic As Picture
    'Private mPicWidth As Single
    'Private mPicHeight As Single
    'Private mCurrentX As Single
    'Private mCurrentY As Single
    'Private mLeft As Single
    'Private mTop As Single

    'Private Sub Form_Load()
    '    mPic = LoadPicture("E:\Down\Tiger.bmp") 'TO DO: Add path to YOUR Picture file here

    '    mPicWidth = Me.ScaleX(mPic.Width, vbHimetric, Picture1.ScaleMode)
    '    mPicHeight = Me.ScaleY(mPic.Height, vbHimetric, Picture1.ScaleMode)
    '    Picture1.AutoRedraw = True
    '    ShowPictureAtPosition(mLeft, mTop)
    'End Sub

    'Private Sub Picture1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '    If Button = 0 Then
    '        mCurrentX = X
    '        mCurrentY = Y
    '    ElseIf Button = vbLeftButton Then
    '        ShowPictureAtPosition(X + mLeft - mCurrentX, Y + mTop - mCurrentY)
    '    End If
    'End Sub

    'Private Sub ShowPictureAtPosition(ByVal pX As Single, ByVal pY As Single)
    '    With Picture1
    '        .Cls()
    '        .PaintPicture(mPic, pX, pY, mPicWidth, mPicHeight)
    '    End With
    'End Sub

    'Private Sub Picture1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '    mLeft = X + mLeft - mCurrentX : mTop = Y + mTop - mCurrentY
    'End Sub

PM Quote
Avatar
Ale96 (Member)
Pro


Messaggi: 132
Iscritto: 06/04/2010

Segnala al moderatore
Postato alle 10:26
Giovedì, 04/08/2011
Ti conviene usare la classe graphics, ogni volta che vuoi cambiare immagine usa il metodo drawimage, se necessario puoi fornire coordinate negative, per usare questa classe leggi la guida di totem che è ben fatta!
http://totemslair.org/guide/viewchapter.php?guida=vb&id=96

PM Quote
Avatar
ashgan (Normal User)
Newbie


Messaggi: 3
Iscritto: 04/08/2011

Segnala al moderatore
Postato alle 12:09
Giovedì, 04/08/2011
Non credo di averci capito molto, comunque praticamente collego un'immagine con un oggetto graphics e tutte le operazioni eseguite su quest'oggetto vengono fatte sull'immagine giusto? Ma comunque poi l'immagine va inserita in una picturebox? Comunque sia ho provato con il metodo drawimage cercando di fargli disegnare la mia immagine da una certa posizione ma, nonostante il codice non generi errori, la posizione non cambia. Il codice che ho usato è questo:

Dim myImage As New Bitmap(filename:="c:\prova.jpg")
Dim G As Graphics

G = Graphics.FromImage(myImage)


g.drawimage(myimage, new Point(500,500))


Dopo quell'istruzione eseguo flush e metto tutto dentro una picturebox, giusto?:

g.flush()

picturebox1.image = myimage


L'immagine viene visualizzata ma senza che sia stata spostata, come se quello che ho fatto in drawimage non ci fosse.

Ultima modifica effettuata da ashgan il 04/08/2011 alle 12:41
PM Quote
Avatar
Ale96 (Member)
Pro


Messaggi: 132
Iscritto: 06/04/2010

Segnala al moderatore
Postato alle 19:17
Giovedì, 04/08/2011
Esattamente come dici: tutte le modifiche apportate all'oggetto graphics modificano l'immagine, prima di ridisegnare l'immagine devi cancellare ciò che c'è prima, usa il metodo clear e passagli come parametro un colore di sfondo:
Dim G as graphics = graphics.fromimage(immagine)
G.clear(systemcolors.control)
...
G.flush
Picturebox.image = immagine

PM Quote
Avatar
remeto (Normal User)
Rookie


Messaggi: 43
Iscritto: 30/11/2007

Segnala al moderatore
Postato alle 6:08
Lunedì, 19/09/2011
Buongiorno, ho un problema, pure io vorrei muovere con il mouse un immagine grande all'interno della picturebox, fin qua tutto facile ma se uso il comando g.clear(colore) mi sparisce tutto e non viene ridisegnata mentre senza il comando g.clear(colore) quando sposto il mouse viene tutto sporcato e sormontato e con un movimento schifoso e scattoso ecco il mio codice simile a ashgan.

Imports VB = Microsoft.VisualBasic
Imports System.Drawing.Drawing2D
Imports System.Drawing.Printing
Imports System.Drawing.Imaging
Public Class Form1
    Dim MyImage As Bitmap
    Dim G As Graphics
    Dim P, P2 As Point
    Dim Drawing As Boolean

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
        MyImage = New Bitmap(My.Resources.Tavolo)
        G = Graphics.FromImage(MyImage)
        G.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

        P2.X = 0 - MyImage.Width + (PictureBox1.Width)
        P2.Y = 0 - MyImage.Height + (PictureBox1.Height)
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'carico immagine nella posizione che desidero
      
        G.DrawImage(MyImage, New Point(P2))
        G.Flush()
        PictureBox1.Image = MyImage
        
    End Sub

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

        P.X = e.X - P2.X
        P.Y = e.Y - P2.Y
        Drawing = True
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

        If Not Drawing Then Exit Sub
        If P.X = e.X Then Exit Sub


        P2.X = e.X - P.X
        P2.Y = e.Y - P.Y


        G.Clear(PictureBox1.BackColor)
        
        G.DrawImage(MyImage, New Point(P2))

        G.Flush()

        PictureBox1.Image = MyImage
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        Drawing = False
    End Sub
End Class


ecco, niente errori ma non ci vengo a capo con quel g.clear(colore)
ho letto pure la guida di totem molto chiara.....
Aiuto!!!!!

Grazie!

Ultima modifica effettuata da remeto il 19/09/2011 alle 6:12
PM Quote
Avatar
Ale96 (Member)
Pro


Messaggi: 132
Iscritto: 06/04/2010

Segnala al moderatore
Postato alle 20:01
Lunedì, 19/09/2011
Devi creare 2 immagini in una ci va l'immagine intera, nell'altra solo il pezzo da mostrare nella picturebox, graphics "deve disegnare" su quest'ultima usando il metodo drawimage e passandogli come parametri l'immagine intera e un punto. L'evento click è inutile rintracciarlo se non ti serve per funzioni particolari.
A occhio l'errore che hai fatto tu è stato usare la stessa immagine questo siglifica che se la sposti ne perdi un pezzo e non lo recuperi se la muovi al contrario.

PM Quote
Avatar
remeto (Normal User)
Rookie


Messaggi: 43
Iscritto: 30/11/2007

Segnala al moderatore
Postato alle 21:09
Lunedì, 19/09/2011
Grazie, mi faresti 2 righe di esempio su come trattare le 2 cose te ne sarei grato...

PM Quote
Avatar
Ale96 (Member)
Pro


Messaggi: 132
Iscritto: 06/04/2010

Segnala al moderatore
Postato alle 18:46
Martedì, 20/09/2011
Ok, questo è un esempio non la pappa pronta, leggilo capisci l'algoritmo e dopo lo copi o lo riscrivi. Non l'ho testato, dimmi se funziona!
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Drawing
  2. Public Class Form1 
  3.     Dim WholeImage As Bitmap
  4.     Dim PbxImage As Bitmap
  5.     Dim G As Graphics 
  6.     Dim P, WholeImagePosition As Point 'WholeImagePosition rappresenta il punto in alto a sinistra dell'immagine rispetto alla picturebox. 
  7. '----------
  8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
  9.          'qui bisogna assegnare un valore all'immagine intera, non la si può lasciare vuota.
  10.         PbxImage = New Bitmap(PictureBox1.Width, PictureBox1.Height)
  11.         G = Graphics.FromImage(PbxImage)
  12.         P = New Point(0,0)
  13.         WholeImagePosition = New Point(0,0) 'posizione di partenza dell'immagine
  14.         G.DrawImage(WholeImage, WholeImagePosition)
  15.          G.Flush()
  16.          PictureBox1.Image = PbxImage
  17.          PictureBox1.Refresh()
  18.     End Sub 
  19.     Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 
  20.         If e.Button = Button.Left Then 'verifica che sia stato premuto il pulsante destro
  21.             P = e.Location 
  22.         End If
  23.     End Sub 
  24.     Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 
  25.         If Not e.Button = Button.Left Then
  26.             Exit Sub
  27.         End If
  28.         G.Clear(Systemcolors.Control) 'viene cancellata l'immagine per evitare effetti trascinamento
  29.         G.DrawImage(WholeImage, New Point(P.X - exX + WholeImagePosition.X, P.Y - e.Y + WholeImagePosition.Y)) 
  30.         G.Flush() 'P è il punto dove abbiamo fatto click, e è il punto dove si trova ora il mouse, la rispettiva differenza delle coordinate indica di quanto si è mosso il mouse e aggiungendo questi valori alle coordinate dell'immagine quest'ultima si muoverà insieme al mouse.
  31.  
  32.         PictureBox1.Image = PbxImage
  33.         PictureBox1.Refresh() 
  34.     End Sub 
  35.     Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp 
  36.         P = New Point(0,0)
  37.         'viene azzerato p, questo psassaggio non è fondamentale, ma serve se altre funzioni usano il valore di p.
  38.     End Sub 
  39. End Class 


Ultima modifica effettuata da Ale96 il 20/09/2011 alle 18:49
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo